package cn.hinglo.gameclaw.data.interceptors;

import cn.hinglo.gameclaw.data.entity.Result;
import cn.hinglo.gameclaw.data.enums.ExceptionEnum;
import cn.hinglo.gameclaw.data.utils.EhcacheUtil;
import cn.hinglo.gameclaw.data.utils.FieldUtils;
import cn.hinglo.gameclaw.data.utils.JwtUtil;
import cn.hinglo.gameclaw.data.utils.ResultUtils;
import org.springframework.web.method.HandlerMethod;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * @createTime: 2018/3/12
 * @author: HingLo
 * @description: 客服端每次的请求都必须携带他的用户的Id，
 */
public class ClientUserIdInterceptors extends BaseInterceptor {
    private static final String prefix = "ClawGame";

    @Override
    boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler, HandlerMethod handlerMethod) throws Exception {
        //获取请求头
        String authHeader = request.getHeader(FieldUtils.AUTHORIZATION);
        if (authHeader == null || !authHeader.startsWith(prefix)) {
            Result result = ResultUtils.error(ExceptionEnum.HEADERERROR);
            ResultUtils.error(response, result);
            return false;
        } else {
            //解密这个请求的token
            String token = authHeader.substring(prefix.length());
            // 拿到token后，从缓存中取出该token对应的用户Id
            String userId = EhcacheUtil.get("token", token);
            if (userId == null) {
                //如果用户该token没有缓存中中，就直接去解密token
                userId = JwtUtil.parseIdJWT(token);
                if (userId == null) {
                    //token错误，即解密失败
                    Result result = ResultUtils.error(ExceptionEnum.TOKENINVALID);
                    ResultUtils.error(response, result);
                    return false;
                } else {
                    // 如果有都检验通过后，现在需要确定的是这userId 是否在我们的数据库中,如果在，就直接放在缓存中，否则就直接说该用户无效
                    if (userId.equals(userId)) {
                        //如果解密成功,就直接放入到缓存中
                        EhcacheUtil.put("token", token, userId);
                    } else {
                        Result result = ResultUtils.error("该用户不存在或者被禁用");
                        ResultUtils.error(response, result);
                        return false;
                    }
                }
            }
            request.setAttribute("userId", userId);
            return true;
        }


    }
}